package reporte.filtros;

import static org.junit.Assert.*;
import java.util.List;
import org.junit.Before;
import ventas.Venta;

public class FiltroAndVentasTest extends FiltroVentaTest{

	@Before
	public void setUp() throws Exception {
		super.setUp();
		this.setSUT( new FiltroVentasDesdeMonto( 100f ) );
	}

	@Override
	public void testDelFiltro() {
		this.testVentasEntreFechas();
		this.testVentasEntreMontos();
		this.testFiltroDeVentasComplejo();
	}

	public void testVentasEntreFechas() {
		Filtro<Venta> sut = new FiltroAnd<Venta>( 
				new FiltroVentasDesdeFecha( fechabase.plusMonths(1) ),
				new FiltroVentasHastaFecha( fechabase.plusMonths(7) ));
		
		List<Venta> ventas = sut.filtrar(lista);
		assertEquals( 3, ventas.size() );
		assertTrue( ventas.contains(venta2) );
		assertTrue( ventas.contains(venta3) );
		assertTrue( ventas.contains(venta4) );
	}
	
	public void testVentasEntreMontos() {
		Filtro<Venta> sut = new FiltroAnd<Venta>( 
				new FiltroVentasDesdeMonto(100f),
				new FiltroVentasHastaMonto(1000f));
		
		List<Venta> ventas = sut.filtrar(lista);
		assertEquals( 2, ventas.size() );
		assertTrue( ventas.contains(venta1) );
		assertTrue( ventas.contains(venta5) );
	}

	
	/**
	 * Se aplica el filtro:
	 * (SinEnvios & MontoDesde 50$) | ConProducto productoBuscado
	 * !{ventas 2 4} & {ventas 1 3} | {ventas 1 2 5}
	 * {ventas 1 3 5} & {ventas 1 3} | {ventas 1 2 5}
	 * {venta 1 3} | {ventas 1 2 5} = {ventas 1 2 3 5}
	 */
	public void testFiltroDeVentasComplejo(){
		Filtro<Venta> filtroProducto = new FiltroVentasPorProducto(productoABuscar),
				filtroSinEnvios = new FiltroNot<Venta>( new FiltroVentasConEnvios()),
				filtroMonto = new FiltroVentasDesdeMonto(50f);
		Filtro<Venta> filtroAnd = new FiltroAnd<Venta>(filtroSinEnvios,filtroMonto),
			filtroOr = new FiltroOr<Venta>( filtroProducto,filtroAnd);
		
		List<Venta> ventas = filtroOr.filtrar(lista);
		assertEquals( 4, ventas.size() );
		assertTrue( ventas.contains(venta1) );
		assertTrue( ventas.contains(venta2) );
		assertTrue( ventas.contains(venta3) );
		assertTrue( ventas.contains(venta5) );
	}
	
	@Override
	public void testDeLaCondicion() {}
}
